home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / a_utils / perl / perl5a1.lha / perl5alpha1 / do / vop < prev   
Encoding:
Text File  |  1992-08-15  |  1.0 KB  |  51 lines

  1. void
  2. do_vop(optype,TARG,left,right)
  3. STR *TARG;
  4. STR *left;
  5. STR *right;
  6. {
  7.     register char *s;
  8.     register char *l = str_get(left);
  9.     register char *r = str_get(right);
  10.     register int len;
  11.  
  12.     len = left->str_cur;
  13.     if (len > right->str_cur)
  14.     len = right->str_cur;
  15.     if (TARG->str_cur > len)
  16.     TARG->str_cur = len;
  17.     else if (TARG->str_cur < len) {
  18.     STR_GROW(TARG,len);
  19.     (void)memzero(TARG->str_ptr + TARG->str_cur, len - TARG->str_cur);
  20.     TARG->str_cur = len;
  21.     }
  22.     TARG->str_pok = 1;
  23.     TARG->str_nok = 0;
  24.     s = TARG->str_ptr;
  25.     if (!s) {
  26.     str_nset(TARG,"",0);
  27.     s = TARG->str_ptr;
  28.     }
  29.     switch (optype) {
  30.     case O_BIT_AND:
  31.     while (len--)
  32.         *s++ = *l++ & *r++;
  33.     break;
  34.     case O_XOR:
  35.     while (len--)
  36.         *s++ = *l++ ^ *r++;
  37.     goto mop_up;
  38.     case O_BIT_OR:
  39.     while (len--)
  40.         *s++ = *l++ | *r++;
  41.       mop_up:
  42.     len = TARG->str_cur;
  43.     if (right->str_cur > len)
  44.         str_ncat(TARG,right->str_ptr+len,right->str_cur - len);
  45.     else if (left->str_cur > len)
  46.         str_ncat(TARG,left->str_ptr+len,left->str_cur - len);
  47.     break;
  48.     }
  49. }
  50.  
  51.